package com.htmessage.fanxinht.widget.swipyrefresh;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.support.v4.view.ViewCompat;
import android.view.animation.Animation;
import android.widget.ImageView;

/**
 * Private class created to work around issues with AnimationListeners being
 * called before the animation is actually complete and support shadows on older
 * platforms.
 * 
 * @hide
 */
class CircleImageView extends ImageView {

	private static final int KEY_SHADOW_COLOR = 0x1E000000;
	private static final int FILL_SHADOW_COLOR = 0x3D000000;
	// PX
	private static final float X_OFFSET = 0f;
	private static final float Y_OFFSET = 1.75f;
	private static final float SHADOW_RADIUS = 3.5f;
	private static final int SHADOW_ELEVATION = 4;

	private Animation.AnimationListener mListener;
	private int mShadowRadius;

	public CircleImageView(Context context, int color, final float radius) {
		super(context);
		final float density = getContext().getResources().getDisplayMetrics().density;
		final int diameter = (int) (radius * density * 2);
		final int shadowYOffset = (int) (density * Y_OFFSET);
		final int shadowXOffset = (int) (density * X_OFFSET);

		mShadowRadius = (int) (density * SHADOW_RADIUS);

		ShapeDrawable circle;
		if (elevationSupported()) {
			circle = new ShapeDrawable(new OvalShape());
			ViewCompat.setElevation(this, SHADOW_ELEVATION * density);
		} else {
			OvalShape oval = new OvalShadow(mShadowRadius, diameter);
			circle = new ShapeDrawable(oval);
			ViewCompat.setLayerType(this, ViewCompat.LAYER_TYPE_SOFTWARE,
					circle.getPaint());
			circle.getPaint().setShadowLayer(mShadowRadius, shadowXOffset,
					shadowYOffset, KEY_SHADOW_COLOR);
			final int padding = (int) mShadowRadius;
			// set padding so the inner image sits correctly within the shadow.
			setPadding(padding, padding, padding, padding);
		}
		circle.getPaint().setColor(color);
		setBackgroundDrawable(circle);
	}

	private boolean elevationSupported() {
		return android.os.Build.VERSION.SDK_INT >= 21;
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		if (!elevationSupported()) {
			setMeasuredDimension(getMeasuredWidth() + mShadowRadius * 2,
					getMeasuredHeight() + mShadowRadius * 2);
		}
	}

	public void setAnimationListener(Animation.AnimationListener listener) {
		mListener = listener;
	}

	@Override
	public void onAnimationStart() {
		super.onAnimationStart();
		if (mListener != null) {
			mListener.onAnimationStart(getAnimation());
		}
	}

	@Override
	public void onAnimationEnd() {
		super.onAnimationEnd();
		if (mListener != null) {
			mListener.onAnimationEnd(getAnimation());
		}
	}

	/**
	 * Update the background color of the circle image view.
	 */
	@SuppressWarnings("ResourceType")
	public void setBackgroundColor(int colorRes) {
		if (getBackground() instanceof ShapeDrawable) {
			final Resources res = getResources();
			((ShapeDrawable) getBackground()).getPaint().setColor(
					res.getColor(colorRes));
		}
	}

	private class OvalShadow extends OvalShape {
		private RadialGradient mRadialGradient;
		private int mShadowRadius;
		private Paint mShadowPaint;
		private int mCircleDiameter;

		public OvalShadow(int shadowRadius, int circleDiameter) {
			super();
			mShadowPaint = new Paint();
			mShadowRadius = shadowRadius;
			mCircleDiameter = circleDiameter;
			mRadialGradient = new RadialGradient(mCircleDiameter / 2,
					mCircleDiameter / 2, mShadowRadius, new int[] {
							FILL_SHADOW_COLOR, Color.TRANSPARENT }, null,
					Shader.TileMode.CLAMP);
			mShadowPaint.setShader(mRadialGradient);
		}

		@Override
		public void draw(Canvas canvas, Paint paint) {
			final int viewWidth = CircleImageView.this.getWidth();
			final int viewHeight = CircleImageView.this.getHeight();
			canvas.drawCircle(viewWidth / 2, viewHeight / 2,
					(mCircleDiameter / 2 + mShadowRadius), mShadowPaint);
			canvas.drawCircle(viewWidth / 2, viewHeight / 2,
					(mCircleDiameter / 2), paint);
		}
	}
}
